//
//  HighscoreViewController.m
//  Palabris
//
//  Created by 822588 on 28.11.12.
//  Copyright 2012 __MyCompanyName__. All rights reserved.
//

#import "HighscoreViewController.h"



@implementation HighscoreViewController


@synthesize mNodeArray;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        
        [self initCustom];
    }
    return self;
}

- (void)dealloc
{
    [mNodeArray release];
    
    [super dealloc];
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    mNodeArray = [[NSArray alloc] init];
    
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

/* Custom initialization
 */
-(void)initCustom{
    
    
    
    // Hier wird die Request erstellt
    mRequest = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:URL_SERVICE]];
    mRequest.delegate = self;
    [mRequest addPostValue:@"hiscore" forKey:@"action"];
    
    // Hier wird die Request gestartet
    // Asynchron, da wir den User waerend dessen eine Loading-Meldung geben wollen (Ladebalken oder Ladekreis)
    [mRequest startAsynchronous];
    
}


////////////////////////////////////
//  Event-Buttons                 //
////////////////////////////////////


/*  PopToRoot to MainscreenViewController
 */
-(IBAction)goMainscreen:(id)sender{
    
    
    // Wir wollen zum Mainscreen (das vorletzte ViewController im Stack) und nicht zu Root
    UIViewController *secondViewController = [self.navigationController.viewControllers objectAtIndex:1];
    [self.navigationController popToViewController:secondViewController animated:YES];
    
}



////////////////////////////////////
//  ASIHTTPRequest Functions      //
////////////////////////////////////



- (void) requestFailed:(ASIHTTPRequest *)request {
    
    // popup
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Request failed" 
                                            message:@"The Request to the Server is failed" 
                                            delegate:nil 
                                            cancelButtonTitle:@"OK"
                                            otherButtonTitles:nil];
    [alert show];
    [alert release];      
    
    mRequest = nil;
}

- (void) requestFinished:(ASIHTTPRequest *)request {
    
    // Dann erstellen wir ein Dokument indem die Element vom XMLFile rein kommen.
    mXMLDocOfEntitys = [[CXMLDocument alloc] initWithXMLString:[mRequest responseString] options:0 error:nil];
    // Hier sagen wir, welches Element wir wollen
    // Explizit hier, fragen wir nach allen "entry"-Elementen
    mNodeArray = [mXMLDocOfEntitys nodesForXPath:@"//entry" error:nil];
    
    
    
    // 
    // Jetzt sortieren wir das Ergebnis via NSSortDirectionary (Foundation Classes)
    // 
    
    NSMutableArray *unSortedarray = [NSMutableArray array]; 
    NSDictionary *dict;    
    
    for (CXMLElement *node in mNodeArray) {
        
        // zuerst werden die Werte von den XML in NSDictionary Objecte rein getan,
        // da NSSortDirectionary nur NSDirectionary sortiert !
        // Achte dabei drauf, dass es nur NSStrings sein sollen. Auch NSInteger !
        dict = [NSDictionary dictionaryWithObjectsAndKeys: [node stringValue], @"username",
                                                            [[node attributeForName:@"score"] stringValue], @"score", 
                                                            nil];
        
        // die NSDictionary kommen einfach in ein unsortiertes Array rein
        [unSortedarray addObject:dict];
    }
    
    // Hier beschreiben wir, wie die Sortierung auszusehen hat
    // 
    // zu comparator, sollte man wissen, dass es nötig ist, weil NSSortDescriptor
    // von Haus aus keine NSInteger sortieren kann, deshalb muss man es wie folgt machen.
    NSSortDescriptor *descriptor = [[[NSSortDescriptor alloc] initWithKey:@"score" ascending:NO 
                                                               comparator:^(id obj1, id obj2) {
        
                                                                   if ([obj1 integerValue] > [obj2 integerValue]) {
                                                                       return (NSComparisonResult)NSOrderedDescending;
                                                                   }
                                                                   if ([obj1 integerValue] < [obj2 integerValue]) {
                                                                       return (NSComparisonResult)NSOrderedAscending;
                                                                   }
                                                                   return (NSComparisonResult)NSOrderedSame;
                                                                }                                                           
                                                               ] autorelease];
    
    // Nun wird es sortiert und zurückgegeben
    mNodeArray = [unSortedarray sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
    [mNodeArray retain];
    
    /* Test
    for(NSDictionary *node in mNodeArray){
        NSLog(@"Score: %@, Name: %@",[node objectForKey:@"score"], [node objectForKey:@"username"]);
    }
    */
     NSLog(@"Count: %i", [mNodeArray count]);
    
    NSLog(@"Name: %@, Score: %@",[[mNodeArray objectAtIndex:4] objectForKey:@"username"],[[mNodeArray objectAtIndex:4] objectForKey:@"score"]); 
    
    
    // Tabelle neu laden !!
    // Da der delegate-Vorgang und somit Tabellendelegierung vor der Funktion des webservice-Aufruf's geschieht, 
    // müssen wir die Tabelle nachdem wir die Highscorewerte haben refreshen/reloaden.
    [tableview reloadData];
    
    mRequest = nil;
}



////////////////////////////////////
//  Table Functions               //
////////////////////////////////////


/*  Anzahl der Sections
 *
 * Hier gibst du an wie viele Sections es gibt.
 */
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    
    return 1;
}

/*  Name der Sections
 
 Das System ruft für jeder Section einmal diese Methode auf und verlangt den Namen des Strings als NSString
 */
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    
    return @"Highscore";
}


/* Anzahl der Zeilen im Table
 *
 * hier gibst du ein NSInteger Wert zurück der aussagt, wie viele Objekte (Zeilen) es in der Tabelle (Section) geben wird.
 */
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    
    NSLog(@"Count: %i", [mNodeArray count]);
    
    return [mNodeArray count];
}


/* Initaufruf von jeder Zeile
 *
 * Hier wird jede einzelne Zeile vor das präsentieren erstellt.
 *
 * @return Eine Zeile als Object (UITableViewCell)
 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SimpleTableIdentifier"];
    
    if (cell == nil) {
        
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"SimpleTableIdentifier"];
        
    }
        
    cell.textLabel.text = [[NSString  alloc] initWithFormat:@"%i. Name: %@, Score: %@",
                           (indexPath.row+1),
                           [[mNodeArray objectAtIndex:indexPath.row] objectForKey:@"username"],
                           [[mNodeArray objectAtIndex:indexPath.row] objectForKey:@"score"]];
    
    
    
    return cell;
}


/* Aktion beim tippen einer Zeile
 *
 * Diese Methode wird auferufen, wenn ein User eine Zeile antippt
 *
 * @return Eine Zeile als Object (UITableViewCell)
 */
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
  
}


@end
